package com.example.retrofitdemo;

import java.util.Map;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Url;

/**
 * Created by tangjiangxu on 11/21/17.
 */

public interface GetRequest_Interface {
    @GET("xxxx")
    Call<Reception> getCall();
    // @GET注解的作用：采用Get方法发送网络请求

    // getCall = 接收网络请求数据的方法
    // 其中返回类型为Call<*>,*是接收类型（即上面定义的Translation类）
    // 如果想直接获得ResponseBody中的内容，可以定义网络请求返回值为Call<ResponseBody>

    /**
     * method: 网络请求的方法（区分大小写）
     * path: 网络请求地址路径
     * hasBody: 是否有请求体
     * @return
     */
    @HTTP(method = "GET", path="blog/{id}", hasBody = false)
    Call<ResponseBody> getCall(@Path("id") int id);

    // ｛id｝表示一个变量
    // method的值retrofit不会做处理，所以要自行保证准确


    /**
     * 表明是一个表单格式的请求（Content-Type:application/x-www-form-urlencoded）
     * Field("username")表示将后面的String name中name的取值作为username的值
     */
    @POST("/form")
    @FormUrlEncoded
    Call<ResponseBody> testFromUrlEncode1(@Field("username") String name, @Field("age") int age);

    /**
     * Map的key作为表单的key
     */
    @POST("/form")
    @FormUrlEncoded
    Call<ResponseBody> testFromUrlEncode2(@FieldMap Map<String, Object> map);

    /**
     * {@lick Part}后面支持三种类型，｛@link RequestBody｝、｛@link okhttp.MultipartBody.Part｝、任意类型
     ＊ 除了｛@link okhttp3.MultipartBody.Part｝以外，其他类型都必须带上表单字段（｛@link okhttp3.MultipartBody.Part｝中已经包含了表单字段的信息）
     */
    Call<ResponseBody> testFileUpload1(@Part("name")RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);

    @GET("user")
    Call<User> getUser(@Header("Authorization") String authorization);

    @Headers("Authorization:authorization")
    @GET("user")
    Call<User> getUser();
    // 以上的效果是一致的
    // 区别在于使用场景和使用方式
    // 1.使用场景：@Header用于添加不固定的请求头，@Headers用于添加固定的请求头
    // 2.使用方式：@Header作用于方法的参数；@Header作用于方法

    @GET("/")
    Call<String> cate(@Query("cate") String cate);

    @GET("user/{user}/repos")
    Call<ResponseBody> getBlog(@Path("user") String user);
    // 访问的api是：https://api.github.com/users/{user}/repos
    // 在发起请求时，｛user｝会被替换为方法的第一个参数user(被@Path注解作用)

    @GET
    Call<ResponseBody> testUrlAndQuery(@Url String url, @Query("showAll") boolean showAll);
    // 当有URL注解时，@GET传入的URL就可以省略
    // 当GET、POST...HTTP等方法中没有设置url时，则必须使用｛@link Url｝提供


}
